GET和POST有什么区别
// get多用来数据的读取,不应对数据的访问有副作用，get是无害的,只读的，多次访问不应对数据有副作用,
// post发送数据给服务端,多次执行可能会产生不同的影响
// get通过url传输 post通过请求体传输
// POST的数据因为在请求主体内，所以有一定的安全性保证，而GET的数据在URL中，通过历史记录，缓存很容易查到数据信息
POST和PUT区别
// put请求，如果两个请求相同后一个会把前一个覆盖掉(可以用来资源的更新)
// post请求，后一个不会把前一个覆盖掉            (可以用来资源的新增)
// ps: 『POST表示创建资源，PUT表示更新资源』这种说法是错误的，两个都能创建资源，根本区别就在于幂等性
PATCH
// 对资源的局部更新，比如你可以只更新一个资源的某个字段，不需要携带其他无用信息
http 主要特点 简单快速 灵活 无连接 无状态
// 灵活 头部会设置数据类型，通过一个http协议就可以完成不同数据类型的传输
// 无连接 连接一次后就会断开
// 无状态 服务端无法区分两次连接是不是同一个身份
// http持久连接 仅 http 1.1版本支持
// http采用的是请求-应答模式，默认是普通连接，每个请求/应答客户端和服务器都要建立一个短连接，完成后立即断开连接
// 当使用keep-Alive模式 keep-Alive功能使客户端到服务器的连接持久有效，当出现对服务器的后续请求的时候，避免了重新建立连接
// http 管线化
// 管线化是通过持久连接完成的，打包一起请求，然后一起响应.
// 1.只有get和head请求可以进行管线化
// 2.需要服务端支持管线化，很多服务端和代理程序对管线化支持不友好，chrome和火狐默认未开启管线化的支持
// 持久连接
// 请求->响应->请求->响应->请求->响应
// 管线化
// 请求->请求->请求->响应->响应->响应
// */
为什么有了HTTP为什么还要HTTPS？
// https是安全版的http，因为http协议的数据都是明文进行传输的，所以对于一些敏感信息的传输就很不安全，
// HTTPS就是为了解决HTTP的不安全而生的。
HTTPS是如何保证安全的
// https://juejin.cn/post/6844904127298797581
// 利用非对称加密传递对称加密的秘钥，然后利用对称加密传递信息
// 客户端发起 HTTPS 请求，服务端返回证书，客户端对证书进行验证，
// 验证通过后本地生成用于改造对称加密算法的随机数，通过证书中的公钥对随机数进行加密传输到服务端，
// 服务端接收后通过私钥解密得到随机数，之后的数据交互通过对称加密算法进行加解密。
中间人攻击
// 客户端和服务器之间存在一个中间人，这个中间人只需要把原本双方互发的公钥换成自己的公钥就可以解密双方发送的所有数据。
// 1.中间人攻击过程
// 2.服务器向客户端发送公钥
// 3.攻击者截获公钥，保存在自己手上
// 4.攻击者生成一个自己伪造的公钥，发给客户端
// 5.客户端收到伪造的秘钥之后，生成加密的hash值发给服务器
// 6.攻击者获得加密的hash值，用自己的私钥解密获得真的秘钥
// 7.同时生成假的加密hash值发给服务器
// 8.服务器用私钥解密获得假秘钥
// 9.服务器用假秘钥传输信息
防止中间人攻击
// 需要一个安全的第三方机构颁发证书 进行数字签名的效验来保证秘钥的传输过程中没有发生过篡改
如何防止证书被篡改的
// ca机构给你的域名搞了一个数字签名，给你颁发了一个证书
// 签名的过程
// 1、CA机构拥有非对称加密的私钥和公钥。
// 2、CA对证书明文信息进行hash。
// 3、对hash后的值用私钥加密，得到数字签名。
// CA机构颁发的证书包含（证书内容的明文+签名）。
// 浏览器拿到证书
// 1、拿到证书里面明文的hash算法并对明文内容进行hash运算，得到A 。
// 2、用CA的公钥解密签名得到B 。
// 3、比较A 和 B，如果相等，说明没有被篡改，否则浏览器提示证书不可信。
// 浏览器内部都内置了各大CA机构的公钥信息
// 浏览器也会检验ssl证书的网站的域名与证书的域名是否一致
HTTP2相对于HTTP1.x有什么优势和特点
// 1.支持多路复用
    // HTTP 1.x 中，如果想并发多个请求，必须使用多个 TCP 链接，且浏览器为了控制资源，还会对单个域名有 6-8个的TCP链接请求限制。
    // 同域名下所有通信都在单个连接上完成。
    // 单个连接可以承载任意数量的双向数据流。
    // 数据流以消息的形式发送，而消息又由一个或多个帧组成，多个帧之间可以乱序发送，因为根据帧首部的流标识可以重新组装
// 2.服务器推送
    // 服务端可以在发送页面HTML时主动推送其它资源，而不用等到浏览器解析到相应位置，发起请求再响应。
    // 例如服务端可以主动把JS和CSS文件推送给客户端，而不需要客户端解析HTML时再发送这些请求。
    // 客户端有权拒收服务器的推送。主动推送也遵守同源策略，服务器不会随便推送第三方资源给客户端。
// 3.头部压缩
    // HTTP/1.x会在请求和响应中中重复地携带不常改变的、冗长的头部数据，给网络带来额外的负担。
    // HTTP/2在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键－值对，对于相同的数据，不再通过每次请求和响应发送
    // 首部表在HTTP/2的连接存续期内始终存在，由客户端和服务器共同渐进地更新;
    // 每个新的首部键－值对要么被追加到当前表的末尾，要么替换表中之前的值。
HTTP的缓存的过程
// 客户端向服务器发出请求，请求资源
// 服务器返回资源，并通过响应头决定缓存策略
// 客户端根据响应头的策略决定是否缓存资源（这里假设是），并将响应头与资源缓存下来
// 在客户端再次请求且命中资源的时候，此时客户端去检查上次缓存的缓存策略，根据策略的不同、是否过期等判断是直接读取本地缓存还是与服务器协商缓存
什么时候会触发强缓存或者协商缓存
// 强缓存
// 强缓存就是强制缓存 一般设置请求头的cahe-control。cache-control: max-age=xxxx，public/private/immutable/no-cache/no-store  
// 客户端和代理服务器都缓存/客户端缓存/即使刷新操作也不会在请求http/跳过强缓存走协商缓存/不缓存
// 每次用户正常打开这个页面，浏览器会判断缓存是否过期，没有过期就从缓存中读取数据
// 协商缓存
// etag：每个文件有一个，改动文件了就变了，就是个文件hash
// last-modified：文件的修改时间，精确到秒
// 发请求-->看资源是否过期-->过期-->请求服务器-->服务器对比资源是否真的过期-->没过期-->返回304状态码-->客户端用缓存的老资源。
// 为什么要有etag
// etag是http1.1新增属性
// 一些文件也许会周期性的更改，但是他的内容并不改变
// 某些文件修改非常频繁，比如在秒以下的时间内进行修改
// 某些服务器不能精确的得到文件的最后修改时间。
TCP 和 UDP 的区别
    // TCP稳定，可靠，在传递数据前会有三次握手来建立连接，多种机制保障数据的准确性 缺点：慢，效率低，占用资源高，
    // UDP 在发送数据前不需要建立连接，速度快，不能保证数据的准确和完整性，会发生丢包，适用于对可靠性要求不高
tcp三次握手，
    // 客户端发一个消息到服务端，告诉服务端我准备了，服务端收到消息，知道他准备了，
    // 同时也发一个消息告诉客户端自己也准备好了
    // 客户端收到服务端发的消息知道服务端也准备好了，同时发送确认状态，这时候完成三次握手
    // TCP相比UDP为什么是可靠的
    // 三次握手确定身份，同步双方信息。tcp有专门的序列号字段，确保数据排列顺序。传输中校验失败或者丢包,超时会重传
 tcp四次挥手
    // 假如客户端要关闭连接，向服务端发送一个消息表示自己没有数据可发送了，但是仍然可以接受数据
    // 服务端收到客户端的消息，然后发送一个确认消息表示自己收到客户端的关闭请求了，但是自己还没准备好关闭连接，客户端收到消息进入到服务器关闭连接的状态
    // 服务端关闭好连接后向客户端发送结束连接，同时等待最后一步客户端发送
    // 客户端收到服务端的关闭请求后，发送一个确认包，同时自己进入等待状态，服务端收到收到这个包，关闭连接进入close状态，客户端等待一定时间后，没有收到服务端的包则认为服务端已经正常关闭，自己进入close状态
跨域
// 同源是指"协议+域名+端口"
// jsonp
// 利用<script>标签不受同源策略限制的特性进行跨域操作。
function JSONP({url,params,callbackKey,callback}){
    params = params || {}
    params[callbackKey] = 'jsonpCallback'

    window.jsonpCallback = callback;
    const paramKeys = Object.keys(params)
    const paramString = paramKeys
    .map(key => `${key}=${params[key]}`)
    .join('&')
    const script = document.createElement('script')
    script.setAttribute('src', `${url}?${paramString}`)
    document.body.appendChild(script)
}
JSONP({  
    url: 'http://s.weibo.com/ajax/jsonp/suggestion',
    params: {
        key: 'test',
    },
    callbackKey: '_cb',
    callback(result) {
        console.log(result.data)
    }
})
// cors
// cors是目前主流的跨域解决方案
// 它使用额外的 HTTP 头来告诉浏览器 哪些地址可以被允许跨域请求资源
// res.header('Access-Control-Allow-Origin', 'http://example.com');

// nginx反向代理
// 反向代理的原理很简单，即所有客户端的请求都必须先经过nginx的处理，nginx作为代理服务器再讲请求转发给node或者java服务，这样就规避了同源策略
